package com.example.jingleai.controller;

import com.example.jingleai.repository.ChatHistoryRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY;

// @RequiredArgsConstructor 注解，用于自动生成类的构造函数，该注解会为类生成一个包含所有final字段的构造函数。
@RequiredArgsConstructor
@RestController
@RequestMapping("/ai")
public class ChatController {// ChatController 类，用于处理与聊天相关的请求。
    private final ChatClient chatClient;

    private final ChatHistoryRepository chatHistoryRepository;

    /**
     * 聊天接口
     *
     * @param prompt 输入内容
     */
// @RequestMapping 注解，用于映射请求路径，该注解可以同时指定多个请求路径。
    @RequestMapping(value = "/chat", produces = "text/html;charset=utf-8")
    public Flux<String> chat(String prompt, String chatId) {// Flux<String> chat(String prompt) 方法，接收用户输入的 prompt，返回一个 Flux 对象，用于流式返回聊天结果。
        //1.保存会话ID
        chatHistoryRepository.save("chat", chatId);

        //2.请求模型
        return chatClient.prompt()
                // 设置用户输入的 prompt 作为 ChatMessage 的 content 属性
                .user(prompt)
                // 给每个会话添加ID，以键值对的形式
                .advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId))
                // 调用 stream() 方法，并获取返回的 ChatMessage 对象的 content 属性，返回给客户端。
                .stream()
                .content();
    }
}
